package org.tools.string;

import java.util.ArrayList;
import java.util.Collection;
import java.util.Iterator;
import java.util.LinkedHashMap;
import java.util.List;
import java.util.StringTokenizer;

import org.apache.commons.lang.ArrayUtils;
import org.apache.commons.lang.StringUtils;
import org.tools.constants.StringPool;

/**
 * 字符串的集合处理工具类.
 * 
 * <pre>
 * 构建组：ibps-base-core
 * 作者：hugh zhuang
 * 邮箱：3378340995@qq.com
 * 日期：2015-10-9-下午11:51:26
 * 版权：广州流辰信息技术有限公司版权所有
 * </pre>
 */
/** 
 * 字符串的集合处理工具类
 *
 * <pre> 
 * 构建组：e-tools
 * 作者：eddy
 * 邮箱：1546077710@qq.com
 * 日期：2017年4月23日-下午5:18:29
 * 版权：E源时代
 * </pre>
 */
public class StringCollections {
	
	/**
	 * 将传入的字符串按token参数进行分割，并存储为String[]数组返回
	 * 
	 * @param stringWithToken
	 * @param token
	 * @return
	 */
	public final static String[] toArray(String stringWithToken, String token) {
		String[] array = null;
		if (stringWithToken != null && stringWithToken.length() > 0 && token != null
				&& token.length() > 0) {
			if (stringWithToken.indexOf(token) > -1) {
				StringTokenizer st = new StringTokenizer(stringWithToken, token);
				if (st != null && st.countTokens() > 0) {
					array = new String[st.countTokens()];
					int i = 0;
					while (st.hasMoreTokens()) {
						array[i++] = st.nextToken();
					}
				}
			} else {
				array = new String[1];
				array[0] = stringWithToken;
			}
		}

		return array;
	}

	/**
	 * 将传入的字符串按英文逗号（默认）进行分割，并存储为String[]数组返回
	 * 
	 * @param stringWithComma
	 * @return
	 */
	public final static String[] toArray(String stringWithComma) {
		return toArray(stringWithComma, StringPool.COMMA);
	}

	/**
	 * 将List字符串集合转成String[]数组返回
	 * 
	 * @param list
	 * @return
	 */
	public final static String[] toArray(List<String> list) {
		String[] array = new String[list.size()];
		for (int i = 0; i < list.size(); i++) {
			array[i] = list.get(i).toString();
		}
		return array;
	}

	/**
	 * 将一个字符串拆分为每一个字符组合成的列表
	 * 
	 * @param letters
	 *            如：abcdef
	 * @return 包括{"a","b","c","d","e","f"}的列表
	 */
	public final static List<String> toListNoToken(String letters) {
		List<String> singles = new ArrayList<String>();
		if (StringUtils.isNotEmpty(letters)) {
			for (int i = 0; i < letters.length(); i++) {
				singles.add(letters.substring(i, i + 1));
			}
		}
		return singles;
	}
	
	/**
	 * 将传入的字符串按token参数进行分割，存储为List<String>返回
	 * 
	 * @param str
	 * @param token
	 * @return
	 */
	public final static List<String> toList(String str, String token) {
		List<String> array = new ArrayList<String>();
		if (str != null && str.length() > 0 && token != null
				&& token.length() > 0) {
			if (str.indexOf(token) > -1) {
				StringTokenizer st = new StringTokenizer(str, token);
				while (st.hasMoreTokens()) {
					array.add(st.nextToken());
				}
			} else {
				array.add(str);
			}
		}
		return array;
	}

	/**
	 * 将字符串按token参数进行分割，然后每部分转成Integer，并存储为List<Integer>返回，注意该str参数必须符合规格（
	 * 每部分可以转成整型）。
	 * 
	 * @param str
	 * @param token
	 * @return
	 */
	public final static List<Integer> toListInteger(String str, String token) {
		List<Integer> array = new ArrayList<Integer>();
		if (str != null && str.length() > 0 && token != null
				&& token.length() > 0) {
			if (str.indexOf(token) > -1) {
				StringTokenizer st = new StringTokenizer(str, token);
				while (st.hasMoreTokens()) {
					array.add(StringConverter.toInteger(st.nextToken()));
				}
			} else {
				array.add(new Integer(str));
			}
		}
		return array;
	}

	/**
	 * 将字符串按token参数进行分割，然后每部分转成Integer，并存储为List<Integer>返回，注意该str参数必须符合规格（
	 * 每部分可以转成整型）。
	 * 
	 * @param str
	 * @param token
	 * @return
	 */
	public final static List<Long> toListLong(String str, String token) {
		List<Long> array = new ArrayList<Long>();
		if (str != null && str.length() > 0 && token != null
				&& token.length() > 0) {
			if (str.indexOf(token) > -1) {
				StringTokenizer st = new StringTokenizer(str, token);
				while (st.hasMoreTokens()) {
					array.add(StringConverter.toLong(st.nextToken()));
				}
			} else {
				array.add(new Long(str));
			}
		}
		return array;
	}

	/**
	 * 将传入的字符串按token1和token2进行分割，并按Name和Value形式存储为链接哈希表。
	 * 字符串的例子：name1#value1,name2#value2..... 对于这个例子，token1为：, token2为：#
	 * 
	 * @param options 字符串，全部选项。
	 * @param tokenEntry ：实体之间的分隔符
	 * @param tokenKeyAndValue   键和值之间的分隔符
	 * @return
	 */
	public final static LinkedHashMap<String, String> toMap(
			String options, String tokenEntry, String tokenKeyAndValue) {
		LinkedHashMap<String, String> map = new LinkedHashMap<String, String>();
		String[] strArray = toArray(options, tokenEntry);
		for (int i = 0; i < strArray.length; i++) {
			String option = strArray[i];
			if (option.indexOf(tokenKeyAndValue) > -1) {
				String[] keyAndValue = toArray(option, tokenKeyAndValue);
				map.put(keyAndValue[0], keyAndValue[1]);
			} else {
				map.put(option, option);
			}
		}
		return map;
	}
	
	/**
	 * appendToken 默认“，”
	 * 将列表的每一个对象调用toString方法，然后每个字符串加上appendToken参数，将合并的字符串返回。
	 * 比如List{"a","b","c"}，传入的apendToken为","，那么返回的字符串为：a,b,c （appendToken只在内部出现）
	 * 
	 * @param objs
	 * @return
	 */
	public final static String toString(Collection<String> objs) {
		return toString(objs,StringPool.COMMA);
	}
	
	/**
	 * 将列表的每一个对象调用toString方法，然后每个字符串加上appendToken参数，将合并的字符串返回。
	 * 比如List{"a","b","c"}，传入的apendToken为","，那么返回的字符串为：a,b,c （appendToken只在内部出现）
	 * 
	 * @param objs
	 * @param appendToken
	 * @return
	 */
	public final static String toString(Collection<String> objs, String appendToken) {
		return toString(objs, appendToken, "");
	}

	/**
	 * 将列表的每一个对象调用toString方法，然后每个字符串加上prefix和appendToken参数，将合并的字符串返回。
	 * 比如List{"a","b","c"}，传入的apendToken为","，prefix为"#"，那么返回的字符串为：#a,#b,#c
	 * （appendToken只在内部出现）
	 * 
	 * @param list
	 * @param appendToken
	 * @param appendPrefix
	 * @return
	 */
	public final static String toString(Collection<String> objs, String appendToken,
			String appendPrefix) {
		if (objs == null || objs.isEmpty())
			return "";
		StringBuilder sb = new StringBuilder();
		Iterator<?> it = objs.iterator();
		while (it.hasNext()) {
			sb.append(appendPrefix).append(it.next()).append(appendToken);
		}
		return sb.substring(0, sb.length() - appendToken.length());
	}
	
	/**
	 * 
	 * 把字符串数组转成按 [appendToken] 参数分隔的字符串
	 * 
	 * @param stringArray
	 * @param appendToken
	 * @return String 返回字符串，格式如1,2,3
	 * @since 1.0.0
	 */
	public static String toString(String[] stringArray, String appendToken) {
		if (ArrayUtils.isEmpty(stringArray))
			return "";
		StringBuffer sb = new StringBuffer();
		for (int i = 0; i < stringArray.length; i++) {
			sb.append(stringArray[i]).append(appendToken);
		}
		return sb.substring(0, sb.length() - appendToken.length());
	}
}
